/*
* Copyright 2015
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://opensource.org/licenses/eclipse-1.0.txt
*/
package de.lynorics.eclipse.jangaroo.ui.wizard;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import com.google.common.base.Joiner;
import de.lynorics.eclipse.jangaroo.ui.JangarooProjectHelper;
public class NewAS3FileWizardPage extends AbstractFileWizardPage {
protected String template;
protected Text packageText;
public NewAS3FileWizardPage(ISelection selection) {
super("wizardPage", selection);
}
@Override
public void createContent(Composite parent) {
createContainerContent(parent);
createPackageContent(parent);
createFileContent(parent);
createTemplateContent(parent);
}
@Override
protected void createContainerContentLable(Composite parent) {
Label label = new Label(parent, SWT.NULL);
label.setText("Source &folder:");
}
@Override
protected void createFileContentLable(Composite parent) {
Label label = new Label(parent, SWT.NULL);
label.setText("File &name:");
}
protected void createPackageContent(Composite parent) {
Label label = new Label(parent, SWT.NULL);
label.setText("&Package:");
packageText = new Text(parent, SWT.BORDER | SWT.SINGLE);
packageText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
packageText.addModifyListener(this);
new Label(parent, SWT.NULL);
}
protected void createTemplateContent(Composite parent) {
Label label = new Label(parent, SWT.NULL);
label.setText("Template:");
SelectionAdapter adapter = new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
template = b.getText().replaceAll("&", "");
}
};
Composite group = new Composite(parent, SWT.NONE);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
group.setLayout(new RowLayout());
createTemplateRadioButton(group, "&Simple", adapter);
createTemplateRadioButton(group, "&Class", adapter).setSelection(true);
createTemplateRadioButton(group, "&Interface", adapter);
template = "Class";
}
protected Button createTemplateRadioButton(Composite group, String name,
SelectionAdapter adapter) {
Button button = new Button(group, SWT.RADIO);
button.setText(name);
button.addSelectionListener(adapter);
return button;
}
@Override
protected void initializeFocus() {
packageText.setSelection(packageText.getText().length());
packageText.setFocus();
}
protected IPath computeRootPath(IResource res, Iterable<IPath> sourcePaths) {
if (res.getType() == IResource.PROJECT) {
Iterator<IPath> iterator = sourcePaths.iterator();
return iterator.hasNext() ? iterator.next() : null;
}
IPath fullPath = res.getFullPath();
for (IPath path : sourcePaths) {
if (path.isPrefixOf(fullPath))
return path;
}
return null;
}
protected String computePackageName(IResource res, IResource cont) {
IPath result = res.getFullPath();
if (res.getType() == IResource.FILE)
result = result.removeLastSegments(0);
int matchingSegments = result.matchingFirstSegments(cont.getFullPath());
result = result.removeFirstSegments(matchingSegments);
return Joiner.on('.').join(result.segments());
}
public static List<IPath> getProjectSourceDirectories (IProject project) {
List<IPath> paths = new ArrayList<IPath>();
try {
if (project.isOpen() && project.getNature(JangarooProjectHelper.NATURE_ID) != null){
IJavaProject javaProject = JavaCore.create(project);
IClasspathEntry[] classpathEntries = null;
classpathEntries = javaProject.getResolvedClasspath(true);
for(int i = 0; i<classpathEntries.length;i++){
IClasspathEntry entry = classpathEntries[i];
if(entry.getContentKind() == IPackageFragmentRoot.K_SOURCE){
paths.add(entry.getPath());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return paths;
}
@Override
protected void initializeWithSelection(IResource resource) {
Iterable<IPath> sourcePaths = getProjectSourceDirectories(resource.getProject());
IPath rootPath = computeRootPath(resource, sourcePaths);
if (rootPath == null)
return;
IWorkspaceRoot wsroot = resource.getWorkspace().getRoot();
IResource cont = wsroot.findMember(rootPath);
if (cont != null) {
String pack = computePackageName(resource, cont);
if (pack != null && pack.length() > 0)
packageText.setText(pack);
} else {
if (resource instanceof IContainer)
cont = (IContainer) resource;
else
cont = resource.getParent();
}
containerText.setText(cont.getFullPath().toString());
}
@Override
protected void dialogChanged() {
String fileName = getFileName();
int indexOf = fileName.indexOf('.');
if (indexOf > 0 && !fileName.matches("^[^.]+\\" + getExtension() + "$")) {
updateStatus("Type name must not contain dots");
} else {
super.dialogChanged();
}
}
public String getPackageName() {
return packageText.getText();
}
public IPath getPackagePath() {
return getContainerPath().append(getPackageName().replace('.', '/'))
.addTrailingSeparator();
}
@Override
public IPath getFilePath() {
return getPackagePath().append(getFileName());
}
public String getTemplate() {
return template;
}
@Override
public String getExtension() {
return ".as";
}
}